from qwen3_agent_function_calling.ToolManager import ToolManager
from qwen3_agent_function_calling.OpenAIClient import OpenAIClient
from qwen3_agent_function_calling.ConversationManager import ConversationManager
import json

class IntelligentAgent:
    """智能代理主类，协调各组件工作"""

    def __init__(self, model: str = "qwen3:4b"):
        self.tool_manager = ToolManager()
        self.client = OpenAIClient(model)
        self.conversation = ConversationManager()

    def process_query(self, user_input: str) -> str:
        """处理用户查询并返回响应"""
        # 添加用户输入到对话历史
        self.conversation.add_message("user", user_input)

        # 构建上下文
        context = self.conversation.build_context()

        # 获取工具定义
        tool_definitions = self.tool_manager.get_tool_definitions()

        try:
            # 调用模型
            response = self.client.chat_completion(context, tool_definitions)
            res_msg = response.choices[0].message

            # 处理工具调用
            if res_msg.tool_calls:
                # 执行工具调用
                tool_result = self._handle_tool_calls(res_msg.tool_calls)
                return tool_result
            else:
                # 直接返回模型回答
                return res_msg.content or "抱歉，没有获取到回答内容"

        except Exception as e:
            return f"处理请求时出错：{str(e)}"
        finally:
            # 添加助手响应到对话历史（无论成功失败）
            # 注意：这里需要先获取结果才能添加，所以实际实现可能需要调整
            pass

    def _handle_tool_calls(self, tool_calls) -> str:
        """处理工具调用"""
        if not tool_calls:
            return "错误：未获取到工具调用指令"

        try:
            # 处理第一个工具调用（可扩展为多工具调用）
            tool_call = tool_calls[0]
            tool_name = tool_call.function.name

            # 解析参数
            try:
                arguments = json.loads(tool_call.function.arguments)
            except json.JSONDecodeError:
                return "错误：工具参数格式不正确"

            # 执行工具
            result = self.tool_manager.execute_tool(tool_name, arguments)
            return result

        except Exception as e:
            return f"工具调用处理失败：{str(e)}"

    def run_interactive(self) -> None:
        """交互式运行"""
        print("智能助手已启动（输入 'exit' 退出，'clear' 清空历史）")
        print("支持功能：数学计算、天气查询、时间查询")
        print("示例：'3加5乘2等于多少？'、'北京天气怎么样？'、'现在几点了？'\n")

        try:
            while True:
                user_input = input("你：").strip()
                if not user_input:
                    print("助手：请输入你的问题\n")
                    continue

                if user_input.lower() == "exit":
                    print("助手：再见！")
                    break

                if user_input.lower() == "clear":
                    self.conversation.clear_history()
                    print("助手：已清空对话历史\n")
                    continue

                # 处理用户输入
                response = self.process_query(user_input)
                # 添加助手响应到对话历史
                self.conversation.add_message("assistant", response)
                # 显示回答
                print(f"助手：{response}\n")

        except KeyboardInterrupt:
            print("\n助手：再见！")
        except Exception as e:
            print(f"程序出错：{str(e)}")
